import Client from '@alicloud/nls-filetrans-2018-08-17';
import { uploadLocalFile } from './oss.js';
import { logger } from '../tools/index.js';

const ENDPOINT = 'http://filetrans.cn-shanghai.aliyuncs.com';
const API_VERSION = '2018-08-17';
const client = new Client({
    accessKeyId: process.env.OSS_AK,
    secretAccessKey: process.env.OSS_SK,
    endpoint: ENDPOINT,
    apiVersion: API_VERSION
});
export const translateVoiceFile = async (filePath) => {
    logger.info('translate voice start, local file path: %s', filePath);
    const fileLink = await uploadLocalFile(filePath);
    logger.info('translate voice, file link: %s', fileLink);

    /**
     * 提交录音文件识别请求，请求参数组合成JSON格式的字符串作为task的值。
     * 请求参数appkey：项目appkey，获取Appkey请前往控制台：https://nls-portal.console.aliyun.com/applist
     * 请求参数file_link：需要识别的录音文件。
     */
    const taskParams = {
        Task: JSON.stringify({
            appkey: process.env.NLS_APP_KEY,
            file_link: fileLink,
            enable_sample_rate_adaptive: true,
            version: "4.0",        // 新接入请使用4.0版本，已接入（默认2.0）如需维持现状，请注释掉该参数设置。
            enable_words: false     // 设置是否输出词信息，默认值为false，开启时需要设置version为4.0。
        })
    };
    // 提交录音文件识别请求，处理服务端返回的响应。
    return new Promise((resolve, reject) => {
        client.submitTask(taskParams, {
            method: 'POST'
        }).then((response) => {
            // 服务端响应信息的状态描述StatusText。
            const createStatusText = response.StatusText;
            if (createStatusText != 'SUCCESS') {
                logger.error('translate voice create task error, %s', createStatusText);
                reject(createStatusText);
                return;
            }

            // 获取录音文件识别请求任务的TaskId，以供识别结果查询使用。
            const taskId = response.TaskId;
            logger.info('translate voice create task successful, taskId: %s', taskId);

            /**
             * 以TaskId为查询参数，提交识别结果查询请求。
             * 以轮询的方式进行识别结果的查询，直到服务端返回的状态描述为"SUCCESS"、SUCCESS_WITH_NO_VALID_FRAGMENT，
             * 或者为错误描述，则结束轮询。
            */
            const timer = setInterval(() => {
                client.getTaskResult({
                    TaskId: taskId
                }).then((response) => {
                    const statusText = response.StatusText;
                    if (statusText == 'RUNNING' || statusText == 'QUEUEING') {
                        // 继续轮询，注意间隔周期。

                    } else {
                        if (statusText == 'SUCCESS' || statusText == 'SUCCESS_WITH_NO_VALID_FRAGMENT') {
                            const translateText = response.Result.Sentences[0].Text;
                            logger.info('translate voice successful, result = %s', translateText);
                            resolve(translateText);
                        } else {
                            logger.error('translate voice query task error, status = %s', statusText);
                            reject(statusText);
                        }
                        // 退出轮询
                        clearInterval(timer);
                    }
                }).catch((error) => {
                    // 异常情况，退出轮询。
                    clearInterval(timer);
                    logger.error('translate voice query task error, err msg: %s', error);
                    reject(error);
                });
            }, 5000);
        }).catch((error) => {
            logger.error('translate voice query task error, err msg: %s', error);
            reject(error);
        });
    });
}